const Packageinfo = require ('../package.json')

const v = Packageinfo.version
// 对象类型的检测，无法区分字面量创建，Object.create和自定义构造函数创建出来的对象具体属于哪个类，
// 三者返回的都是Object
function classOf(o){
    if(o === undefined) return undefined 
    if(o === null) return null
    return Object.prototype.toString.call(o).slice(8,-1).toLowerCase() 
}
function page131(){
    console.log(137);
    
}

// 复制一个或多个对象的自有的可枚举|不可枚举属性(即实例属性)到一个新对象，并返回这个新对象
function extend(...args){
    if(args.some((arg)=>{return classOf(arg) !== 'object'}) ) throw TypeError('extend()的参数应该为object类型')
    let obj = Object.create(null)
    let newObj = args.reduce((accu,curr)=>{
        let names = Object.getOwnPropertyNames(curr)  // 所有自有的可枚举|非可枚举属性
        for(let i =0;i<names.length;i++){
            if(names[i] in accu) continue            // 跳过同名属性
            let desc = Object.getOwnPropertyDescriptor(curr,names[i]),
                currClass = classOf(desc.value)
            // 如果属性值类型为function,则不另行处理，因为方法就应该是各实例间共享的
            if(/object/g.test(currClass)) desc.value = extend(desc.value) // 如果属性值类型为object
            if(/array/g.test(currClass)){ // 如果属性值类型为array
                desc.value = JSON.parse(JSON.stringify(desc.value)) // 复制出一个新的value
            } 
            Object.defineProperty(accu,names[i],desc)
        }
        return accu
    },obj)
    return newObj
}
export {
    v,
    classOf,
    extend
}
